package com.jackstraw.jack_base.rules.entity.dto;


import com.jackstraw.jack_base.rules.entity.enums.SceneTypeEnum;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 规则引擎统一出入口
 */
public class RuleExcuteDto {

    /**
     * 场景标识
     */
    private SceneTypeEnum sceneTypeEnum;

    /**
     * 规则引擎参数
     * <p>
     * factObjects (Map<String,Object>): BOM对象集合
     * ----key:BOM对象全类名
     * ----value：BOM对象
     * ruleName:要执行规则名称的前缀
     * groupName：要执行的规则分组
     *
     * Other
     */
    private Map<String, Object> body = new ConcurrentHashMap<>(8);

    /**
     * 私有化构造器
     */
    private RuleExcuteDto() {
    }

    /**
     * 私有化构造器
     *
     * @param sceneTypeEnum 场景标识
     */
    private RuleExcuteDto(SceneTypeEnum sceneTypeEnum) {
        this.sceneTypeEnum = sceneTypeEnum;
    }

    /**
     * 构造者模式创建对象
     *
     * @param sceneTypeEnum 场景标识
     * @return
     */
    public static RuleExcuteDto instance(SceneTypeEnum sceneTypeEnum) {
        return new RuleExcuteDto(sceneTypeEnum);
    }

    /**
     * 构造者模式创建对象
     *
     * @param sceneTypeEnum 场景标识
     * @param body
     * @return
     */
    public static RuleExcuteDto instance(SceneTypeEnum sceneTypeEnum, Map<String, Object> body) {
        RuleExcuteDto ruleExcuteDto = new RuleExcuteDto(sceneTypeEnum);
        ruleExcuteDto.body.putAll(body);
        return ruleExcuteDto;
    }


    /**
     * 设置参数
     *
     * @param key
     * @param value
     */
    public void put(String key, Object value) {
        this.body.put(key, value);
    }

    /**
     * 移除一个指定参数
     *
     * @param key
     */
    public void remove(String key) {
        this.body.remove(key);
    }

    /**
     * 移除全量参数
     */
    public void remove() {
        this.body.clear();
    }

    /**
     * 批量放置参数
     *
     * @param body
     */
    public void putAll(Map<String, Object> body) {
        this.body.putAll(body);
    }

    /**
     * 清空并批量放置参数
     *
     * @param body
     */
    public void clearAndPutAll(Map<String, Object> body) {
        this.remove();
        this.body.putAll(body);
    }

    /**
     * 获取参数
     *
     * @param key
     * @return
     */
    public Object get(String key) {
        return this.body.get(key);
    }

    /**
     * 获取所有的
     *
     * @return
     */
    public Map<String, Object> getBody() {
        return body;
    }

    /**
     * 获取所有参数类型
     *
     * @return
     */
    public List<String> keys() {
        return new ArrayList<>(this.body.keySet());
    }

    public SceneTypeEnum getSceneTypeEnum() {
        return sceneTypeEnum;
    }
}
